function BooksManager(app, div) {

	var self = this;
	this.view = null;
	this.books = new Array();
    this.userId = null;
    this.subscribers = new Array();

    this.subscribe = function(subscriber) {
        this.subscribers.push(subscriber);
    };

	this.unsubscribe = function(subscriber) {
		this.subscribers.remove(subscriber);
	};

	this.loadBooks = function(userId) {
        if(this.view == null) {
            this.view = new ListView(div, {
	            autoSelect: true,
	            cookie: 'bookId',
                listTitle: 'Ваши книги:',
                editTitle: 'Редактирование книги',
                listDiv: 'booksList',
                contextMenuDiv: 'booksContextMenu',
                updateDialogDiv: 'booksUpdateDialog',
                inputDiv: 'newBook',
                createBtnDiv: 'createBookBtn',
                createItemFn: function(name) {
                    self.createBook(name);
                },
                updateItemFn: function(bookId, name) {
                    self.updateBook(bookId, name);
                },
                removeItemFn: function(bookId) {
                    self.removeBook(bookId);
                },
                onSelect: function(book) {
                    self.onBookSelectionChange(book);
                }
            }).init();
            this.subscribe(this.view);
        }

        this.userId = userId;
        app.showProgress('Загрузка книг пользователя ...');
		$.ajax({
			url: 'service/books/read.txt',
			data: { userId: userId },
			async: true,
			cache: false,
			success: function (data, status, xhr) {
				self.books.length = 0;
				var response = jQuery.parseJSON(data);
				$.each(response.items, function(index, book) {
					self.books.push(new Book(book.id, book.name, book.ownerId));
				});

				$.each(self.subscribers, function(index, subscriber) {
                    subscriber.updateItems(self.books);
                });
				app.showNotification('Книги загружены', 3000);
			},
			error: function () {
				app.showError('Ошибка при загрузке книг', 'Не удалось загрузить книги');
			}
		});
	};

	this.onBookSelectionChange = function(book) {
		if(app.setBook(book)) {
			app.showNotification('Выбрана книга ' + book.name, 3000);
		} else {
			app.cleanNotification();
		}
	};

	this.createBook = function(name) {
		$.ajax({
			url: 'service/books/submit.txt',
			type: 'POST',
			data: { bookId: null, name: name },
			async: true,
			cache: false,
			success: function (data, status, xhr) {
				var response = jQuery.parseJSON(data);
				if(response.result) {
                    app.showNotification('Книга создана', 3000);
                    self.loadBooks(self.userId);
                } else {
                    app.showNotification('Не удалось создать книгу: ' + response.message, 5000);
                }
			},
			error: function () {
                app.showNotification('Не удалось создать книгу: ' + response.message, 3000);
            }
		});
	};

    this.updateBook = function(bookId, name) {
        $.ajax({
            url: 'service/books/submit.txt',
            data: { bookId: bookId, name: name },
            async: true,
            cache: false,
            success: function (data, status, xhr) {
                var response = jQuery.parseJSON(data);
                if(response.result) {
                    app.showNotification('Книга изменена', 3000);
                    self.loadBooks(self.userId);
                } else {
                    app.showNotification('Не удалось изменить книгу: ' + response.message, 5000);
                }
            },
            error: function () {
                app.showNotification('Не удалось изменить книгу', 3000);
            }
        });
    };

    this.removeBook = function(bookId) {
        $.ajax({
            url: 'service/books/remove.txt',
            data: { bookId: bookId, name: name },
            async: true,
            cache: false,
            success: function (data, status, xhr) {
                var response = jQuery.parseJSON(data);
                if(response.result) {
                    app.showNotification('Книга удалена', 3000);
                    self.loadBooks(self.userId);
                } else {
                    app.showNotification('Не удалось удалить книгу: ' + response.message, 5000);
                }
            },
            error: function () {
                app.showNotification('Не удалось удалить книгу: ' + response.message, 3000);
            }
        });
    };
};